package com.zxjbyte.yiyi.extension.job.core.trigger.route;

import org.quartz.DailyTimeIntervalScheduleBuilder;
import org.quartz.TimeOfDay;

import static org.quartz.DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule;

/**
 * 每日时间间隔触发器
 * DailyTimeIntervalTrigger在每天的指定时间段内，以一定的时间间隔触发任务。你可以设置开始和结束时间，以及间隔时间和单位（秒、分钟、小时等）。
 * 这种触发器适合于需要在每天的特定时间段内执行任务的场景。
 *
 * @Author zhangxingjia
 * @Date 2023/10/8 15:41
 * @Version: 1.0
 */
public class DailyTimeIntervalTriggerHelper {

    /**
     * 创建 DailyTimeIntervalScheduleBuilder
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder newDailyTimeIntervalSchedule(){
        return dailyTimeIntervalSchedule();
    }

    /**
     * 每工作日(既周一到周五)的指定时间触发任务
     * @param hour 每日触发的开始时间 (单位小时)
     * @param minute 每日触发的开始时间 (单位分钟)
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder onWeekdaysAtHourAndMinute(int hour, int minute){
        return dailyTimeIntervalSchedule()
                .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(hour, minute))
                .withIntervalInHours(24)
                .onMondayThroughFriday();
    }

    /**
     * 每休息日(既周六和周日)的指定时间触发任务
     * @param hour 每日触发的开始时间 (单位小时)
     * @param minute 每日触发的开始时间 (单位分钟)
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder onWeekendAtHourAndMinute(int hour, int minute){
        return dailyTimeIntervalSchedule()
                .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(hour, minute))
                .withIntervalInHours(24)
                .onSaturdayAndSunday();
    }

    /**
     * 每天的指定时间触发任务
     * @param hour 每日触发的开始时间 (单位小时)
     * @param minute 每日触发的开始时间 (单位分钟)
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder dailyAtHourAndMinute(int hour, int minute){
        return dailyTimeIntervalSchedule()
                .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(hour, minute))
                .withIntervalInHours(24)
                .onEveryDay();
    }

    /**
     * 每天的指定时间间隔触发任务
     * @param intervalMinutes 设置触发的时间间隔，单位为分钟
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder dailyWithIntervalInMinutes(int intervalMinutes) {
        return dailyTimeIntervalSchedule()
                .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(0, 0))
                .withIntervalInMinutes(intervalMinutes)
                .onEveryDay();
    }

    /**
     * 每天在指定的时间范围内触发任务（默认时间间隔为每1分钟执行一次）
     * @param startHour 每日触发的开始时间 (单位小时)
     * @param startMinute 每日触发的开始时间 (单位分钟)
     * @param endHour 每日触发的结束时间 (单位小时)
     * @param endMinute 每日触发的结束时间 (单位分钟)
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder dailyWithinTimeRange(int startHour, int startMinute, int endHour, int endMinute) {
        return dailyTimeIntervalSchedule()
                .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(startHour, startMinute))
                .endingDailyAt(TimeOfDay.hourAndMinuteOfDay(endHour, endMinute))
                .onEveryDay();
    }

    /**
     * 每天在指定的时间范围内触发任务, 并且指定时间间隔（单位：秒）
     * 未指定秒默认为00秒触发
     *
     * @param startHour 每日触发的开始时间 (单位小时)
     * @param startMinute 每日触发的开始时间 (单位分钟)
     * @param endHour 每日触发的结束时间 (单位小时)
     * @param endMinute 每日触发的结束时间 (单位分钟)
     * @param intervalInSeconds 设置触发的时间间隔，单位为秒
     * @return
     */
    public static DailyTimeIntervalScheduleBuilder dailyWithinTimeRange(int startHour, int startMinute, int endHour, int endMinute, int intervalInSeconds) {
        DailyTimeIntervalScheduleBuilder builder = dailyWithinTimeRange(startHour, startMinute, endHour, endMinute);
        builder.withIntervalInSeconds(intervalInSeconds);
        return builder;
    }


}
